{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import random\n",
    "import time\n",
    "from tqdm import tqdm\n",
    "sns.set()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_vocab(file, lower = False):\n",
    "    with open(file, 'r') as fopen:\n",
    "        data = fopen.read()\n",
    "    if lower:\n",
    "        data = data.lower()\n",
    "    data = data.split()\n",
    "    vocab = list(set(data))\n",
    "    return data, vocab\n",
    "\n",
    "def embed_to_onehot(data, vocab):\n",
    "    onehot = np.zeros((len(data)), dtype = np.int32)\n",
    "    for i in range(len(data)):\n",
    "        onehot[i] = vocab.index(data[i])\n",
    "    return onehot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "text, text_vocab = get_vocab('shakespeare.txt', lower = True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "learning_rate = 0.001\n",
    "batch_size = 16\n",
    "sequence_length = 32\n",
    "epoch = 3000\n",
    "num_layers = 2\n",
    "size_layer = 256\n",
    "possible_batch_id = range(len(text) - sequence_length - 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Model:\n",
    "    def __init__(\n",
    "        self, num_layers, size_layer, dimension, sequence_length, learning_rate\n",
    "    ):\n",
    "        def lstm_cell():\n",
    "            return tf.nn.rnn_cell.LSTMCell(\n",
    "                size_layer, sequence_length, state_is_tuple = False\n",
    "            )\n",
    "\n",
    "        self.rnn_cells = tf.nn.rnn_cell.MultiRNNCell(\n",
    "            [lstm_cell() for _ in range(num_layers)], state_is_tuple = False\n",
    "        )\n",
    "        self.X = tf.placeholder(tf.int32, (None, None))\n",
    "        self.Y = tf.placeholder(tf.int32, (None, None))\n",
    "        embeddings = tf.Variable(\n",
    "            tf.random_uniform([len(text_vocab), size_layer], -1, 1)\n",
    "        )\n",
    "        encoder_embedded = tf.nn.embedding_lookup(embeddings, self.X)\n",
    "        self.hidden_layer = tf.placeholder(\n",
    "            tf.float32, (None, num_layers * 2 * size_layer)\n",
    "        )\n",
    "        self.outputs, self.last_state = tf.nn.dynamic_rnn(\n",
    "            self.rnn_cells,\n",
    "            encoder_embedded,\n",
    "            initial_state = self.hidden_layer,\n",
    "            dtype = tf.float32,\n",
    "        )\n",
    "        self.logits = tf.layers.dense(self.outputs, dimension)\n",
    "        logits_long = tf.reshape(self.logits, [-1, dimension])\n",
    "        y_batch_long = tf.reshape(self.Y, [-1])\n",
    "        self.cost = tf.reduce_mean(\n",
    "            tf.nn.sparse_softmax_cross_entropy_with_logits(\n",
    "                logits = logits_long, labels = y_batch_long\n",
    "            )\n",
    "        )\n",
    "        self.optimizer = tf.train.AdamOptimizer(learning_rate).minimize(\n",
    "            self.cost\n",
    "        )\n",
    "        self.correct_pred = tf.equal(\n",
    "            tf.argmax(logits_long, 1), tf.cast(y_batch_long, tf.int64)\n",
    "        )\n",
    "        self.accuracy = tf.reduce_mean(tf.cast(self.correct_pred, tf.float32))\n",
    "        self.final_outputs = tf.nn.softmax(self.logits)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7f64aec669b0>: Using a concatenated state is slower and will soon be deprecated.  Use state_is_tuple=True.\n",
      "WARNING:tensorflow:<tensorflow.python.ops.rnn_cell_impl.LSTMCell object at 0x7f6548592fd0>: Using a concatenated state is slower and will soon be deprecated.  Use state_is_tuple=True.\n"
     ]
    }
   ],
   "source": [
    "tf.reset_default_graph()\n",
    "sess = tf.InteractiveSession()\n",
    "model = Model(num_layers, size_layer, len(text_vocab), sequence_length, learning_rate)\n",
    "sess.run(tf.global_variables_initializer())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train_random_sequence():\n",
    "    LOST, ACCURACY = [], []\n",
    "    pbar = tqdm(range(epoch), desc = 'epoch')\n",
    "    for i in pbar:\n",
    "        last_time = time.time()\n",
    "        init_value = np.zeros((batch_size, num_layers * 2 * size_layer))\n",
    "        batch_x = np.zeros((batch_size, sequence_length))\n",
    "        batch_y = np.zeros((batch_size, sequence_length))\n",
    "        batch_id = random.sample(possible_batch_id, batch_size)\n",
    "        for n in range(sequence_length):\n",
    "            id1 = embed_to_onehot([text[k + n] for k in batch_id],text_vocab)\n",
    "            id2 = embed_to_onehot([text[k + n + 1] for k in batch_id],text_vocab)\n",
    "            batch_x[:,n] = id1\n",
    "            batch_y[:,n] = id2\n",
    "        last_state, _, loss = sess.run([model.last_state, model.optimizer, model.cost], \n",
    "                                       feed_dict = {model.X: batch_x, \n",
    "                                                    model.Y: batch_y,\n",
    "                                                    model.hidden_layer: init_value})\n",
    "        accuracy = sess.run(model.accuracy, feed_dict = {model.X: batch_x, \n",
    "                                                         model.Y: batch_y, \n",
    "                                                         model.hidden_layer: init_value})\n",
    "        ACCURACY.append(accuracy); LOST.append(loss)\n",
    "        init_value = last_state\n",
    "        pbar.set_postfix(cost = loss, accuracy = accuracy)\n",
    "    return LOST, ACCURACY"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "epoch: 100%|██████████| 3000/3000 [11:22<00:00,  4.88it/s, accuracy=0.104, cost=6.09] \n"
     ]
    }
   ],
   "source": [
    "LOST, ACCURACY = train_random_sequence()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize = (15, 5))\n",
    "plt.subplot(1, 2, 1)\n",
    "EPOCH = np.arange(len(LOST))\n",
    "plt.plot(EPOCH, LOST)\n",
    "plt.xlabel('epoch')\n",
    "plt.ylabel('loss')\n",
    "plt.subplot(1, 2, 2)\n",
    "plt.plot(EPOCH, ACCURACY)\n",
    "plt.xlabel('epoch')\n",
    "plt.ylabel('accuracy')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['would', 'grow', 'into', 'extremes.', 'sly:']\n"
     ]
    }
   ],
   "source": [
    "split_text = text\n",
    "selected_index = np.random.randint(0, len(split_text) - 5)\n",
    "tag = split_text[selected_index:selected_index + 5]\n",
    "print(tag)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "def generate_based_sequence(length_sentence, argmax = False):\n",
    "    sentence_generated = tag[:]\n",
    "    onehot = embed_to_onehot(tag, text_vocab)\n",
    "    init_value = np.zeros((1, num_layers * 2 * size_layer))\n",
    "    for i in range(len(tag)):\n",
    "        batch_x = np.zeros((1, 1))\n",
    "        batch_x[0] = onehot[i]\n",
    "        last_state, prob = sess.run(\n",
    "            [model.last_state, model.final_outputs],\n",
    "            feed_dict = {model.X: batch_x, model.hidden_layer: init_value},\n",
    "        )\n",
    "        init_value = last_state\n",
    "\n",
    "    for i in range(length_sentence):\n",
    "        if argmax:\n",
    "            char = np.argmax(prob[0][0])\n",
    "        else:\n",
    "            char = np.random.choice(range(len(text_vocab)), p = prob[0][0])\n",
    "        element = [text_vocab[char]]\n",
    "        sentence_generated += element\n",
    "        onehot = embed_to_onehot(element, text_vocab)\n",
    "        batch_x = np.zeros((1, 1))\n",
    "        batch_x[0] = onehot[0]\n",
    "        last_state, prob = sess.run(\n",
    "            [model.last_state, model.final_outputs],\n",
    "            feed_dict = {model.X: batch_x, model.hidden_layer: init_value},\n",
    "        )\n",
    "        init_value = last_state\n",
    "\n",
    "    return ' '.join(sentence_generated)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "would grow into extremes. sly: i have been a man to the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the king of the\n"
     ]
    }
   ],
   "source": [
    "print(generate_based_sequence(100,True))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "would grow into extremes. sly: he hath confess in me, tend no is my weakness too: the nature but no that's after a brace of chastity as made or honour to whip the other little meaning. duchess and tribunes, die; the cedar can have so maid you do take my word signior death? what, no, sir, his remember, be a part of england, that that came together to all her, to them, romeo: victory, that worthy sayings we will needs grieve me? or his son, of an steeds, lord cold lord mayor: true, away, on fortune sir, not sell you forth. king edward iv: the\n"
     ]
    }
   ],
   "source": [
    "print(generate_based_sequence(100,False))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
